package org.pcorp.battlespace.construction.service.graph;

import java.awt.Color;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JFrame;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.data.KeyToGroupMap;
import org.jfree.data.general.DefaultKeyedValues2DDataset;
import org.jfree.data.general.KeyedValues2DDataset;
import org.jfree.ui.GradientPaintTransformType;
import org.jfree.ui.StandardGradientPaintTransformer;
import org.pcorp.battlespace.construction.modele.PuissanceArc;
import org.pcorp.battlespace.utils.CodeCnt;

public class GraphPuissance {
	static public JFreeChart getGraphStat(Map<Integer, PuissanceArc> puissances) {
		ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
		JFreeChart chart = ChartFactory.createStackedBarChart(
						"",
						"",     // domain axis label
						"", // range axis label
						createDataset(puissances),         // data
						PlotOrientation.HORIZONTAL,
						false,            // include legend
						false,            // tooltips
						false            // urls
		);


		CategoryPlot plot = (CategoryPlot) chart.getPlot();
		plot.setRenderer(getRenderer());

		plot.setBackgroundPaint(null);
		//plot.setDomainGridlinePaint(Color.white);
		plot.setDomainGridlinesVisible(false);
		//plot.setRangeGridlinePaint(Color.white);
		plot.setRangeGridlinesVisible(false);
		plot.setOutlineVisible(false);

		NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
		rangeAxis.setVisible(false);
		rangeAxis.setUpperMargin(0.1);
		rangeAxis.setLowerMargin(0.1);
		CategoryAxis catAxis = plot.getDomainAxis();
		catAxis.setVisible(false);
		catAxis.setUpperMargin(0.1);
		catAxis.setLowerMargin(0.1);


		chart.removeLegend();
		return chart;
	}


	private static KeyedValues2DDataset createDataset(Map<Integer, PuissanceArc> puissances) {
		DefaultKeyedValues2DDataset data = new DefaultKeyedValues2DDataset();
		PuissanceArc puiss;

		puiss = puissances.get(CodeCnt.AVANT);
		if (puiss != null) {
			data.addValue(puiss.getPuissanceHp(), "AVANTD_HP", "0");
			data.addValue((puiss.getPuissance()-puiss.getPuissanceHp()), "AVANTD", "0");
			data.addValue(-puiss.getPuissanceHp(), "AVANTG_HP", "0");
			data.addValue(-(puiss.getPuissance()-puiss.getPuissanceHp()), "AVANTG", "0");
		}

		puiss = puissances.get(CodeCnt.AVANT_DROIT);
		if (puiss != null) {
			data.addValue(puiss.getPuissanceHp(), "AVANTD_AD_HP", "0");
			data.addValue((puiss.getPuissance()-puiss.getPuissanceHp()), "AVANTD_AD", "0");
			data.addValue(-puiss.getPuissanceHp(), "AVANTG_AD_HP", "0");
			data.addValue(-(puiss.getPuissance()-puiss.getPuissanceHp()), "AVANTG_AD", "0");
		}

		puiss = puissances.get(CodeCnt.DROIT);
		if (puiss != null) {
			data.addValue(puiss.getPuissanceHp(), "DROITD_HP", "0");
			data.addValue((puiss.getPuissance()-puiss.getPuissanceHp()), "DROITD", "0");
			data.addValue(-puiss.getPuissanceHp(), "DROITG_HP", "0");
			data.addValue(-(puiss.getPuissance()-puiss.getPuissanceHp()), "DROITG", "0");
		}
		puiss = puissances.get(CodeCnt.ARRIERE_DROIT);
		if (puiss != null) {
			data.addValue(puiss.getPuissanceHp(), "ARRIERED_D_HP", "0");
			data.addValue((puiss.getPuissance()-puiss.getPuissanceHp()), "ARRIERED_D", "0");
			data.addValue(-puiss.getPuissanceHp(), "ARRIEREG_D_HP", "0");
			data.addValue(-(puiss.getPuissance()-puiss.getPuissanceHp()), "ARRIEREG_D", "0");
		}

		puiss = puissances.get(CodeCnt.ARRIERE);
		if (puiss != null) {
			data.addValue(puiss.getPuissanceHp(), "ARRIERED_HP", "0");
			data.addValue((puiss.getPuissance()-puiss.getPuissanceHp()), "ARRIERED", "0");
			data.addValue(-puiss.getPuissanceHp(), "ARRIEREG_HP", "0");
			data.addValue(-(puiss.getPuissance()-puiss.getPuissanceHp()), "ARRIEREG", "0");
		}

		return data;
	}

	private static StackedBarRenderer getRenderer() {
		GroupedStackedBarRenderer renderer = new GroupedStackedBarRenderer();
		KeyToGroupMap map = new KeyToGroupMap("G1");

		map.mapKeyToGroup("AVANTD_HP", "G1");
		map.mapKeyToGroup("AVANTD", "G1");
		map.mapKeyToGroup("AVANTG_HP", "G1");
		map.mapKeyToGroup("AVANTG", "G1");

		map.mapKeyToGroup("AVANTD_AD_HP", "G2");
		map.mapKeyToGroup("AVANTD_AD", "G2");
		map.mapKeyToGroup("AVANTG_AD_HP", "G2");
		map.mapKeyToGroup("AVANTG_AD", "G2");

		map.mapKeyToGroup("DROITD_HP", "G3");
		map.mapKeyToGroup("DROITD", "G3");
		map.mapKeyToGroup("DROITG_HP", "G3");
		map.mapKeyToGroup("DROITG", "G3");

		map.mapKeyToGroup("ARRIERED_D_HP", "G4");
		map.mapKeyToGroup("ARRIERED_D", "G4");
		map.mapKeyToGroup("ARRIEREG_D_HP", "G4");
		map.mapKeyToGroup("ARRIEREG_D", "G4");

		map.mapKeyToGroup("ARRIERED_HP", "G5");
		map.mapKeyToGroup("ARRIERED", "G5");
		map.mapKeyToGroup("ARRIEREG_HP", "G5");
		map.mapKeyToGroup("ARRIEREG", "G5");

		renderer.setSeriesToGroupMap(map); 

		Color gp0 = new Color(88, 117, 203);
		Color gp2 = new Color(88, 117, 203);
		Color gp1 = new Color(217, 109, 36);
		Color gp3 = new Color(217, 109, 36);

		for (int i=0; i<20;i++) {
			if (i%4==0) {
				renderer.setSeriesPaint(i, gp0);
				continue;
			}

			if (i%4==2) {
				renderer.setSeriesPaint(i, gp2);
				continue;
			}

			if (i%4==3) {
				renderer.setSeriesPaint(i, gp3);
			}
			else {
				renderer.setSeriesPaint(i, gp1);
			}
		}

		renderer.setItemMargin(0.1);
		renderer.setDrawBarOutline(false);
		renderer.setGradientPaintTransformer(new StandardGradientPaintTransformer(GradientPaintTransformType.HORIZONTAL));
		return renderer;
	}


	public static void main(String[] args) {
		JFrame jframe = new JFrame();
		Map<Integer, PuissanceArc> puissances = new HashMap<Integer, PuissanceArc>();
		PuissanceArc p = new PuissanceArc();
		p.setPuissance(20);
		p.setPuissanceHp(5);
		puissances.put(CodeCnt.AVANT, p);
		p = new PuissanceArc();
		p.setPuissance(35);
		p.setPuissanceHp(12);
		puissances.put(CodeCnt.AVANT_DROIT, p);
		p = new PuissanceArc();
		p.setPuissance(45);
		p.setPuissanceHp(20);
		puissances.put(CodeCnt.DROIT, p);
		p = new PuissanceArc();
		p.setPuissance(20);
		p.setPuissanceHp(5);
		puissances.put(CodeCnt.ARRIERE_DROIT, p);
		p = new PuissanceArc();
		p.setPuissance(5);
		p.setPuissanceHp(5);
		puissances.put(CodeCnt.ARRIERE, p);

		JFreeChart chart = getGraphStat(puissances);
		// we put the chart into a panel
		ChartPanel chartPanel = new ChartPanel(chart);

		jframe.setContentPane(chartPanel);
		jframe.pack();
		jframe.setVisible(true);
	}
}
